package buyChance

import (
	"util"
)

const C_Charge = 1 //千分之一

//types: 可接受的预警模型类型；
//检查预警信号的类型是否不匹配用户需求，不符合返回true，符合返回false和符合预警类型
func (bc *BuyChance) CheckType(types util.ModeType, cdModel, cdOnly bool) (bool, util.ModeType) {
	mt := util.ModeType(0)
	if cdOnly { //加仓额只允许用于接收超跌预警
		if cdModel { //用户允许接收超跌预警
			mt = bc.Type & types & util.MODE_CHAODIE
			return mt == 0, mt
		} else { //用户不允许接收超跌预警
			return true, mt
		}
	} else { //加仓额可用于任何类型股票
		if cdModel { //用户允许接收超跌预警
			mt = bc.Type & types
			return mt == 0, mt
		} else { //用户不允许接收超跌预警
			mt = bc.Type & types & (^util.MODE_CHAODIE)
			return mt == 0, mt
		}
	}
}

//*******用于非对标账户*******\\
//检查出击信号的预期成交额和价格是否符合推荐标准，不符合返回true，符合返回false
//只有调配时check max amount
func (bc *BuyChance) checkAmount(capital int64, prices []int64, capitals []int64, standard int64, checkMaxAmount bool, p util.Period) bool {
	//已分配成交额需低于预期成交额的（standard/100），并且小于每只股票能分配的最大成交额限度(util.MaxAmount)
	if bc.AssignedTransaction*100 > bc.AvgTransaction*standard {
		return true
	}
	//预期成交额需超过用户加仓额的100倍；且用户每仓的加仓额能够购买该股票数量超过120股（包含120股）（考虑charge手续费）
	if capital*100 > bc.AvgTransaction {
		return true
	}
	for i, price := range prices {
		if capitals[i]*1000 < price*120*(1000+C_Charge) {
			return true
		}
	}
	return checkMaxAmount && bc.checkMaxAmount(p)
}

//已分配成交额需低于每只股票能分配的最大成交额限度(util.MaxAmount),仅调配时使用
//不符合返回true，符合返回false
func (bc *BuyChance) checkMaxAmount(p util.Period) bool {
	return bc.AssignedTransaction > util.MaxAmount[p]
}

//*******用于对标账户*******\\
//检查出击信号的已分配次数和价格是否符合推荐标准，不符合返回true，符合返回false
func (bc *BuyChance) checkCount(capital int64, prices []int64, capitals []int64, standard int64) bool {
	//剩余成交额大于20000
	if bc.AvgTransaction*standard-bc.AssignedTransaction*100 < 20000*100*100 {
		return true
	}
	//预期成交额需超过用户加仓额的100倍；且用户每仓的加仓额能够购买该股票数量超过120股（包含120股）（考虑charge手续费）
	if capital*100 > bc.AvgTransaction {
		return true
	}
	for i, price := range prices {
		if capitals[i]*1000 < price*120*(1000+C_Charge) {
			return true
		}
	}
	//已分配的账户数不能超过util.MaxCount
	return bc.AssignedCount >= util.MaxCount
}

func (bc *BuyChance) CheckAmount(capital int64, prices []int64, capitals []int64, standard int64, checkMaxAmount bool, p util.Period, isSAcc bool) bool {
	if isSAcc { //对标账户
		return bc.checkCount(capital, prices, capitals, standard)
	}
	return bc.checkAmount(capital, prices, capitals, standard, checkMaxAmount, p)
}
